<?php



	// 获取传入的网络段参数
	if ($argc < 2) {
		// 接收用户输入的网络段
		echo "Enter the network segment (e.g, 192.168.1): ";
		$network = trim(fgets(STDIN));
        if(!$network)
			$network='192.168.1';
	}else{
		$network = $argv[1];
	}

	$line = isset($argv[3])?$argv[3]:0;	//是否只显示在线IP，默认显示所有
	$usec = isset($argv[2])?$argv[2]:10;	//设置超时时间，默认10ms

	$timeout = 0;	// 超时时间，单位为秒
	$t=0;			//在线主机计数
	$startTime = microtime(true);	//开始时间
	
	for ($i = 1; $i <= 255; $i++) {
		$ip = $network . '.' . $i; // 拼接IP地址

		$icmp_socket = socket_create(AF_INET, SOCK_RAW, 1); // 创建原始套接字

		if ($icmp_socket === false) {
			echo "Error creating socket\n";
			exit;
		}

		socket_set_option($icmp_socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => $usec*1000)); // 设置超时时间

		$request = "\x08\x00\x39\x2f\x00\x00\x00\x00Ping"; // 构造ICMP包

		@socket_connect($icmp_socket, $ip, null); // 连接到指定IP

		@socket_send($icmp_socket,$request,12, 0); // 发送ICMP包
		
		if (@socket_read($icmp_socket, 255)) {
			$t++;	//记录在线主机数量
			//echo可以进行 ICMP 通信IP";
			echo '['.$i."]\t";
			
			//10列换行，仅显示在线IP
			if($line and $t%10 == 0){
				echo "\n";
			
			//10列换行，显示所有IP
			}else if(!$line and $i%10 == 0){
				echo "\n";
			}
		} else {
			if(!$line){
				echo $i."\t";
				
				//10列换行，显示所有IP
				if($i%10 == 0){
					echo "\n";
				}
			}
		}

		socket_close($icmp_socket); // 关闭套接字
		
	}

	$endTime = microtime(true);		//结束时间
	
	$totalTime = round(($endTime - $startTime) * 1000, 2);	//总共花费时间
	$totalTime = round($totalTime/1000,2);
	
	echo "\n Total: $t .";
	echo "Total time spent: {$totalTime} ms\n";

?>